home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / MISC / COIL200 / TEXTROUT.ASM < prev   
Assembly Source File  |  1996-09-29  |  5KB  |  389 lines

  1. ; Routines for outputing text in color modes
  2. ;
  3. ; works in any model
  4. ;
  5. ; Author: Emil LAURENTIU
  6. ; Date:      Sunday, 29 September 1996
  7.  
  8. jumps
  9. locals
  10. .MODEL SMALL,C
  11.  
  12. .DATA
  13.     PUBLIC    C    mono
  14.     PUBLIC    C    ega_vga
  15. mono        dw    0
  16. ega_vga        dw    0
  17. init_ok        dw    0
  18. page_off    dw    0
  19. base_port    dw    ?
  20. v_segment    dw    0b800h
  21. chars        dw    ?
  22. c_page        db    ?
  23. max_row        db    25
  24. max_col        db    ?
  25. attrib        db    2
  26. t_row        db    ?
  27. t_col        db    ?
  28. direction    db    0
  29.  
  30. .CODE
  31.  
  32.     PUBLIC    C    textinit
  33.     PUBLIC    C    textout
  34.  
  35. get_cursorpoz    proc    near
  36.     mov    ax,40h
  37.     mov    es,ax
  38.     mov    bh,0
  39.     mov    bl,c_page
  40.     shl    bl,1
  41.     add    bx,50h
  42.     mov    ax,es:[bx]
  43.     mov    t_col,al
  44.     mov    t_row,ah
  45.     ret
  46. get_cursorpoz    endp
  47.  
  48. set_cursorpoz    proc    near
  49.     mov    ax,40h
  50.     mov    es,ax
  51.     mov    bh,0
  52.     mov    bl,c_page
  53.     shl    bl,1
  54.     add    bx,50h
  55.     mov    al,t_col
  56.     mov    ah,t_row
  57.     mov    es:[bx],ax
  58.     mov    bx,page_off
  59.     mov    al,t_row
  60.     mul    max_col
  61.     add    bx,ax
  62.     mov    al,t_col
  63.     cbw
  64.     add    bx,ax
  65.     mov    dx,base_port
  66.     mov    al,0eh
  67.     out    dx,al
  68.     jmp    short    $+2
  69.     inc    dx
  70.     mov    al,bh
  71.     out    dx,al
  72.     dec    dx
  73.     jmp    short    $+2
  74.     mov    al,0fh
  75.     out    dx,al
  76.     jmp    short    $+2
  77.     inc    dx
  78.     mov    al,bl
  79.     out    dx,al
  80.     dec    dx
  81.     jmp    short    $+2
  82.     ret
  83. set_cursorpoz    endp
  84.  
  85. put_char proc     near
  86.     push    ax
  87.     mov    bx,page_off
  88.     mov    al,t_row
  89.     mul    max_col
  90.     add    bx,ax
  91.     mov    al,t_col
  92.     cbw
  93.     add    bx,ax
  94.     shl    bx,1
  95.     mov    ax,v_segment
  96.     mov    es,ax
  97.     pop    ax
  98.     mov    ah,attrib
  99.     mov    es:[bx],ax
  100.     inc    chars
  101.     ret
  102. put_char endp
  103.  
  104. get_hexdigit    proc    near
  105.     lodsb
  106.     or    al,20h
  107.     sub    al,'0'
  108.     cmp    al,0ah
  109.     jb    ex_hex
  110.     sub    al,27h
  111. ex_hex: and    al,0fh
  112.     ret
  113. get_hexdigit    endp
  114.  
  115. get_decimal2    proc    near
  116.     push    bx
  117.     lodsw
  118.     sub    ax,3030h
  119.     mov    bx,ax
  120.     mov    al,10
  121.     mul    bl
  122.     add    al,bh
  123.     pop    bx
  124.     ret
  125. get_decimal2    endp
  126.  
  127. set_noblink    proc    near
  128.     push    ax
  129.     cmp    ega_vga,1
  130.     jnz    @@ex_set
  131.     mov    dx,base_port
  132.     add    dx,6
  133.     in    al,dx
  134.     jmp    short $+2
  135.     mov    dx,3c0h
  136.     mov    al,30h
  137.     out    dx,al
  138.     jmp    short $+2
  139.     inc    dx
  140.     in    al,dx
  141.     mov    ah,al
  142.     and    ah,NOT 8
  143.     dec    dx
  144.     jmp    short $+2
  145.     mov    dx,base_port
  146.     add    dx,6
  147.     in    al,dx
  148.     jmp    short $+2
  149.     mov    dx,3c0h
  150.     mov    al,30h
  151.     out    dx,al
  152.     jmp    short $+2
  153.     mov    al,ah
  154.     out    dx,al
  155.     jmp    short $+2
  156. @@ex_set:
  157.     pop    ax
  158.     ret
  159. set_noblink    endp
  160.  
  161. set_attrib    proc    near
  162.     mov    ax,v_segment
  163.     mov    es,ax
  164.     mov    di,page_off
  165.     mov    al,max_col
  166.     mul    max_row
  167.     mov    cx,ax
  168.     mov    al,07
  169. @@lp:    inc    di
  170.     stosb
  171.     loop    @@lp
  172.     ret
  173. set_attrib    endp
  174.  
  175. textinit PROC    C
  176.     push    di
  177.     mov    ax,40h
  178.     mov    es,ax
  179.     mov    ax,es:[63h]
  180.     mov    base_port,ax
  181.     mov    al,es:[62h]
  182.     mov    c_page,al
  183.     mov    ax,es:[4Eh]
  184.     mov    page_off,ax
  185.     mov    al,es:[4Ah]
  186.     mov    max_col,al
  187.     mov    al,es:[87h]
  188.     test    al,2
  189.     jz    @@sk7
  190.     mov    mono,1
  191. @@sk7:    test    al,60h
  192.     jz    @@sk6
  193.     mov    ega_vga,1
  194.     mov    al,es:[84h]
  195.     inc    al
  196.     mov    max_row,al
  197. @@sk6:    mov    al,es:[65h]
  198.     test    al,4
  199.     jz    @@sk1
  200.     mov    mono,1
  201.     mov    v_segment,0b000h
  202.     mov    attrib,07
  203.     jmp    @@sk5
  204. @@sk1:    call    set_noblink
  205. @@sk5:    call    set_attrib
  206.     mov    al,es:[65h]
  207.     test    al,1        ; graphic / text mode ?
  208.     mov    ax,0
  209.     jz    @@sk2
  210.     mov    ax,1
  211. @@sk2:    mov    init_ok,ax
  212.     pop    di
  213.     ret
  214. textinit endp
  215.  
  216. textout PROC    C    string:DATAPTR
  217.     push    si di
  218.     cmp    init_ok,1
  219.     jnz    t_ret
  220.     mov    chars,0
  221. if @datasize
  222.     lds    si,string
  223. else
  224.     mov    si,string
  225. endif
  226.     call    get_cursorpoz
  227. more:
  228.     lodsb
  229.     test    al,al
  230.     jz    str_end
  231.     cmp    al,'%'
  232.     jz    special
  233.     cmp    al,0dh
  234.     jz    ch_cr
  235.     cmp    al,0ah
  236.     jz    ch_lf
  237.     cmp    al,08h
  238.     jz    ch_bs
  239. normal:
  240.     call    put_char
  241.     cmp    direction,0
  242.     jz    dir0
  243.     cmp    direction,1
  244.     jz    dir1
  245.     cmp    direction,2
  246.     jz    dir2
  247.     cmp    direction,3
  248.     jz    dir3
  249. dir3:
  250.     cmp    t_row,0
  251.     jz    str_end
  252.     dec    t_row
  253.     jmp    more
  254. dir2:
  255.     cmp    t_col,0
  256.     jz    str_end
  257.     dec    t_col
  258.     jmp    more
  259. dir0:
  260.     inc    t_col
  261.     mov    al,t_col
  262.     cmp    al,max_col
  263.     jb    more
  264. ch_lf:
  265.     mov    t_col,0
  266. dir1:
  267.     inc    t_row
  268.     mov    al,t_row
  269.     cmp    al,max_row
  270.     jb    more
  271.     dec    t_row
  272. scroll:
  273.     push    si
  274.     mov    di,page_off
  275.     mov    si,di
  276.     mov    al,max_col
  277.     cbw
  278.     shl    ax,1
  279.     add    si,ax
  280.     mov    al,max_col
  281.     mul    max_row
  282.     mov    cx,ax
  283.     push    ds
  284.     mov    ax,v_segment
  285.     mov    ds,ax
  286.     mov    es,ax
  287.     rep    movsw
  288.     pop    ds
  289.     mov    ax,0720h
  290.     mov    cl,max_col
  291.     rep    stosw
  292.     pop    si
  293.     jmp    more
  294. ch_cr:
  295.     mov    t_col,0
  296.     jmp    more
  297. ch_bs:
  298.     cmp    t_col,0
  299.     jz    more
  300.     dec    t_col
  301.     mov    al,' '
  302.     call    put_char
  303.     jmp    more
  304. special:
  305.     lodsb
  306.     cmp    al,'%'
  307.     jz    normal
  308.     or    al,20h
  309.     cmp    al,'a'
  310.     jz    attrib_color
  311.     cmp    al,'b'
  312.     jz    back_color
  313.     cmp    al,'f'
  314.     jz    front_color
  315.     cmp    al,'r'
  316.     jz    set_row
  317.     cmp    al,'c'
  318.     jz    set_col
  319.     cmp    al,'d'
  320.     jz    set_dir
  321.     jmp    more
  322. back_color:
  323.     call    get_hexdigit
  324.     cmp    mono,1
  325.     jnz    @@sb
  326.     test    al,8
  327.     mov    al,0
  328.     jz    @@sb
  329.     mov    al,7
  330. @@sb:    mov    ah,attrib
  331.     and    ah,0fh
  332.     shl    al,4
  333.     or    ah,al
  334.     mov    attrib,ah
  335.     jmp    more
  336. front_color:
  337.     call    get_hexdigit
  338.     cmp    mono,1
  339.     jnz    @@sf
  340.     cmp    al,0
  341.     jz    @@sf
  342.     or    al,7
  343. @@sf:    mov    ah,attrib
  344.     and    ah,0f0h
  345.     or    ah,al
  346.     mov    attrib,ah
  347.     jmp    more
  348. attrib_color:
  349.     call    get_hexdigit
  350.     cmp    mono,1
  351.     jnz    @@sa1
  352.     test    al,8
  353.     mov    al,0
  354.     jz    @@sa1
  355.     mov    al,7
  356. @@sa1:    shl    al,4
  357.     mov    ah,al
  358.     call    get_hexdigit
  359.     cmp    mono,1
  360.     jnz    @@sa2
  361.     cmp    al,0
  362.     jz    @@sa2
  363.     or    al,7
  364. @@sa2:    or    ah,al
  365.     mov    attrib,ah
  366.     jmp    more
  367. set_row:
  368.     call    get_decimal2
  369.     mov    t_row,al
  370.     jmp    more
  371. set_col:
  372.     call    get_decimal2
  373.     mov    t_col,al
  374.     jmp    more
  375. set_dir:
  376.     call    get_hexdigit
  377.     and    al,3
  378.     mov    direction,al
  379.     jmp    more
  380. str_end:
  381.     call    set_cursorpoz
  382.     mov    ax,chars
  383. t_ret:
  384.     pop    di si
  385.     ret
  386. textout endp
  387.  
  388.     END
  389.